<script>
    /**
     * leetCode 238
     * @param {number[]} nums
     * @return {number[]}
     */
    /*  
     var productExceptSelf = function(nums) {
         let sum =1;
         const array=[];
         nums.forEach(element => sum*=element);
         console.log(sum);
         for(let i=0;i<nums.length;i++){
             array.push(sum/nums[i])
         }
         return array;
     }; 
     */

/*     var productExceptSelf = function (nums) {
        let length = nums.length;
        // 定义一个新数组长度为nums的长度
        const arr = new Array(length);
        // i是arr的索引
        for (let i = 0; i < length; i++) {
            arr[i] = 1;
            console.log(i);
            // j是遍历nums中的每个元素
            for (let j = 0; j < length; j++) {
                if (i == j)
                    continue;
                // 每个nums都进行相乘
                arr[i] *= nums[j];
                console.log(i, j);

            }
        }
        return arr;
    }; */

    /* 
    
    1.没法用除法，因此我们只能通过计算nums[i]左右的乘积相乘得到结果
    2.左右的乘积可以复用保存，但题目要求我们使用O(1)的空间复杂度，而返回的数组不被计入复杂度，那么可以用来当做一边乘积的存储空间
    3.另一边无法保存，可以用一个变量保存，因为结果是上一次的结果累加
    4.所以我们先计算每一个i对应的左边的乘积，存在对应的res[i]上，再倒序遍历数组计算right，得出结果

    
    */
    var productExceptSelf = function (nums) {
        const res = [];
        res[0] = 1;
        for (let i = 1; i < nums.length; i++) {
            res[i] = res[i - 1] * nums[i - 1];
        }

        let right = 1;
        for (let j = nums.length - 1; j >= 0; j--) {
            res[j] *= right;
            right *= nums[j];
        }

        return res;


    }






    console.log(productExceptSelf([1, 2, 3]));


</script>